﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Mvc.HelpDesk.Data;
using System.Xml;
using Mvc.HelpDesk.Models;
using System.IO;

namespace Mvc.HelpDesk.Controllers
{
    public class IncidenteController : Controller
    {
        private HelpDeskEntities db = new HelpDeskEntities();

        //
        // GET: /Incidente/

        public ViewResult Index()
        {
            var incidentes = db.INCIDENTES.Include("PRIORIDADE").Include("STATUS");

            List<IncidenteModel> incModel = (from INCIDENTE i in incidentes.ToList()
                                             select new IncidenteModel
                                             {
                                                 IDINCIDENTE = i.IDINCIDENTE,
                                                 strNomeAtendente = db.PROFISSIONAIS.Where(x => x.IDPROFISSIONAL == i.IDATENDENTE).FirstOrDefault().NOMEPROFISSIONAL,
                                                 strNomeSolicitante = db.PROFISSIONAIS.Where(x => x.IDPROFISSIONAL == i.IDSOLICITANTE).FirstOrDefault().NOMEPROFISSIONAL,
                                                 strSubCategoria = db.SUBCATEGORIAs.Where(x => x.IDSUBCATEGORIA == i.IDSUBCATEGORIA).FirstOrDefault().NOMESUBCATEGORIA,
                                                 DescIncidente = i.DESCRINCIDENTE,
                                                 DtAbertura = i.DATAABERTURA,
                                                 dtFechamento = i.DATAFECHAMENTO,
                                                 strPrioridade = db.PRIORIDADEs.Where(x => x.IDPRIORIDADE == i.IDPRIORIDADE).FirstOrDefault().DESCRPRIORIDADE,
                                                 strStatus = db.STATUS.Where(x => x.IDSTATUS == i.IDSTATUS).FirstOrDefault().DESCRSTATUS
                                             }).ToList();

            return View(incModel);
        }

        //
        // GET: /Incidente/Details/5

        public ViewResult Details(int id)
        {
            INCIDENTE incidente = db.INCIDENTES.Single(i => i.IDINCIDENTE == id);
            IncidenteModel incidenteModel = new IncidenteModel
                                             {
                                                 IDINCIDENTE = incidente.IDINCIDENTE,
                                                 strNomeAtendente = db.PROFISSIONAIS.Where(x => x.IDPROFISSIONAL == incidente.IDATENDENTE).FirstOrDefault().NOMEPROFISSIONAL,
                                                 strNomeSolicitante = db.PROFISSIONAIS.Where(x => x.IDPROFISSIONAL == incidente.IDSOLICITANTE).FirstOrDefault().NOMEPROFISSIONAL,
                                                 strSubCategoria = db.SUBCATEGORIAs.Where(x => x.IDSUBCATEGORIA == incidente.IDSUBCATEGORIA).FirstOrDefault().NOMESUBCATEGORIA,
                                                 DescIncidente = incidente.DESCRINCIDENTE,
                                                 DtAbertura = incidente.DATAABERTURA,
                                                 dtFechamento = incidente.DATAFECHAMENTO,
                                                 strPrioridade = db.PRIORIDADEs.Where(x => x.IDPRIORIDADE == incidente.IDPRIORIDADE).FirstOrDefault().DESCRPRIORIDADE,
                                                 strStatus = db.STATUS.Where(x => x.IDSTATUS == incidente.IDSTATUS).FirstOrDefault().DESCRSTATUS
                                             };
            return View(incidenteModel);
        }

        //
        // GET: /Incidente/Create

        public ActionResult Create()
        {
            ViewBag.IDATENDENTE = new SelectList(db.PROFISSIONAIS, "IDPROFISSIONAL", "NOMEPROFISSIONAL");
            ViewBag.IDSOLICITANTE = new SelectList(db.PROFISSIONAIS, "IDPROFISSIONAL", "NOMEPROFISSIONAL");
            ViewBag.IDSUBCATEGORIA = new SelectList(db.SUBCATEGORIAs, "IDSUBCATEGORIA", "NOMESUBCATEGORIA");



            ViewBag.IDPRIORIDADE = new SelectList(db.PRIORIDADEs, "IDPRIORIDADE", "DESCRPRIORIDADE");
            ViewBag.IDSTATUS = new SelectList(db.STATUS, "IDSTATUS", "DESCRSTATUS");
            return View();
        }

        //
        // POST: /Incidente/Create

        [HttpPost]
        public ActionResult Create(INCIDENTE incidente)
        {
            if (ModelState.IsValid)
            {
                int count = db.INCIDENTES.Count();
                incidente.DATAABERTURA = DateTime.Now;
                incidente.IDINCIDENTE = count;
                db.INCIDENTES.AddObject(incidente);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.IDATENDENTE = new SelectList(db.PROFISSIONAIS, "IDPROFISSIONAL", "NOMEPROFISSIONAL", incidente.IDPRIORIDADE);
            ViewBag.IDSOLICITANTE = new SelectList(db.PROFISSIONAIS, "IDPROFISSIONAL", "NOMEPROFISSIONAL", incidente.IDSOLICITANTE);
            ViewBag.IDSUBCATEGORIA = new SelectList(db.SUBCATEGORIAs, "IDSUBCATEGORIA", "NOMESUBCATEGORIA", incidente.IDSUBCATEGORIA);

            ViewBag.IDPRIORIDADE = new SelectList(db.PRIORIDADEs, "IDPRIORIDADE", "DESCRPRIORIDADE", incidente.IDPRIORIDADE);
            ViewBag.IDSTATUS = new SelectList(db.STATUS, "IDSTATUS", "DESCRSTATUS", incidente.IDSTATUS);

            //ViewBag.IDPRIORIDADE = new SelectList(db.PRIORIDADEs, "IDPRIORIDADE", "DESCRPRIORIDADE", incidente.IDPRIORIDADE);
            //ViewBag.IDSTATUS = new SelectList(db.STATUS, "IDSTATUS", "DESCRSTATUS", incidente.IDSTATUS);
            return View(incidente);
        }

        //
        // GET: /Incidente/Edit/5

        public ActionResult Edit(int id)
        {
            INCIDENTE incidente = db.INCIDENTES.Single(i => i.IDINCIDENTE == id);
            ViewBag.IDATENDENTE = new SelectList(db.PROFISSIONAIS, "IDPROFISSIONAL", "NOMEPROFISSIONAL", incidente.IDPRIORIDADE);
            ViewBag.IDSOLICITANTE = new SelectList(db.PROFISSIONAIS, "IDPROFISSIONAL", "NOMEPROFISSIONAL", incidente.IDSOLICITANTE);
            ViewBag.IDSUBCATEGORIA = new SelectList(db.SUBCATEGORIAs, "IDSUBCATEGORIA", "NOMESUBCATEGORIA", incidente.IDSUBCATEGORIA);

            ViewBag.IDPRIORIDADE = new SelectList(db.PRIORIDADEs, "IDPRIORIDADE", "DESCRPRIORIDADE", incidente.IDPRIORIDADE);
            ViewBag.IDSTATUS = new SelectList(db.STATUS, "IDSTATUS", "DESCRSTATUS", incidente.IDSTATUS);
            return View(incidente);
        }

        //
        // POST: /Incidente/Edit/5

        [HttpPost]
        public ActionResult Edit(INCIDENTE incidente)
        {
            if (ModelState.IsValid)
            {
                INCIDENTE inc = db.INCIDENTES.Where(x => x.IDINCIDENTE == incidente.IDINCIDENTE).FirstOrDefault();
                inc.IDINCIDENTE = incidente.IDINCIDENTE;
                inc.IDATENDENTE = incidente.IDATENDENTE;
                inc.IDSOLICITANTE = incidente.IDSOLICITANTE;
                inc.IDPRIORIDADE = incidente.IDPRIORIDADE;
                inc.IDSTATUS = incidente.IDSTATUS;
                inc.IDSUBCATEGORIA = incidente.IDSUBCATEGORIA;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.IDPRIORIDADE = new SelectList(db.PRIORIDADEs, "IDPRIORIDADE", "DESCRPRIORIDADE", incidente.IDPRIORIDADE);
            ViewBag.IDSTATUS = new SelectList(db.STATUS, "IDSTATUS", "DESCRSTATUS", incidente.IDSTATUS);
            return View(incidente);
        }

        //
        // GET: /Incidente/Delete/5

        public ActionResult Delete(int id)
        {
            INCIDENTE incidente = db.INCIDENTES.Single(i => i.IDINCIDENTE == id);
            IncidenteModel incidenteModel = new IncidenteModel
            {
                IDINCIDENTE = incidente.IDINCIDENTE,
                strNomeAtendente = db.PROFISSIONAIS.Where(x => x.IDPROFISSIONAL == incidente.IDATENDENTE).FirstOrDefault().NOMEPROFISSIONAL,
                strNomeSolicitante = db.PROFISSIONAIS.Where(x => x.IDPROFISSIONAL == incidente.IDSOLICITANTE).FirstOrDefault().NOMEPROFISSIONAL,
                strSubCategoria = db.SUBCATEGORIAs.Where(x => x.IDSUBCATEGORIA == incidente.IDSUBCATEGORIA).FirstOrDefault().NOMESUBCATEGORIA,
                DescIncidente = incidente.DESCRINCIDENTE,
                DtAbertura = incidente.DATAABERTURA,
                dtFechamento = incidente.DATAFECHAMENTO,
                strPrioridade = db.PRIORIDADEs.Where(x => x.IDPRIORIDADE == incidente.IDPRIORIDADE).FirstOrDefault().DESCRPRIORIDADE,
                strStatus = db.STATUS.Where(x => x.IDSTATUS == incidente.IDSTATUS).FirstOrDefault().DESCRSTATUS
            };
            return View(incidenteModel);
        }

        //
        // POST: /Incidente/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            INCIDENTE incidente = db.INCIDENTES.Single(i => i.IDINCIDENTE == id);
            db.INCIDENTES.DeleteObject(incidente);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        public ActionResult ExportXML(int id)
        {
            INCIDENTE incidente = db.INCIDENTES.Single(i => i.IDINCIDENTE == id);

            XmlDocument xmldoc = new XmlDocument();
            XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
            xmldoc.AppendChild(xmlnode);

            XmlElement elementRoot = xmldoc.CreateElement("HELPDESK.dbo.INCIDENTES");



            CriarCampoPropriedade(xmldoc, elementRoot, "IDINCIDENTE", incidente.IDINCIDENTE.ToString());
            CriarCampoPropriedade(xmldoc, elementRoot, "IDATENDENTE", incidente.IDATENDENTE.ToString());
            CriarCampoPropriedade(xmldoc, elementRoot, "IDSOLICITANTE", incidente.IDSOLICITANTE.ToString());
            CriarCampoPropriedade(xmldoc, elementRoot, "IDSUBCATEGORIA", incidente.IDSUBCATEGORIA.ToString());
            CriarCampoPropriedade(xmldoc, elementRoot, "DESCRINCIDENTE", incidente.DESCRINCIDENTE.ToString());
            CriarCampoPropriedade(xmldoc, elementRoot, "DATAABERTURA", incidente.DATAABERTURA.ToString("s"));
            if (incidente.DATAFECHAMENTO != null)
            {
                CriarCampoPropriedade(xmldoc, elementRoot, "DATAFECHAMENTO", incidente.DATAFECHAMENTO.Value.ToString("s"));
            }
            else
            {
                CriarCampoPropriedade(xmldoc, elementRoot, "DATAFECHAMENTO", "");

            }
            CriarCampoPropriedade(xmldoc, elementRoot, "IDSTATUS", incidente.IDSTATUS.ToString());
            CriarCampoPropriedade(xmldoc, elementRoot, "IDPRIORIDADE", incidente.IDPRIORIDADE.ToString());

            xmldoc.AppendChild(elementRoot);

            return new ContentResult
            {
                ContentType = "text/xml",
                Content = xmldoc.InnerXml,
                ContentEncoding = System.Text.Encoding.UTF8
            };

            //return new XmlResult(xmldoc, "Chamado.xml");
        }

        public ActionResult ImportXml()
        {
            string file = "c:\\Xmls\\Import.xml";

            StreamReader sr = new StreamReader(file);
            string strFile = sr.ReadToEnd();
            XmlDocument doc = new XmlDocument();
            INCIDENTE incidente = db.INCIDENTES.CreateObject();

            doc.LoadXml(strFile);
            incidente.IDATENDENTE = Convert.ToInt32(GetTextValue(doc, "IDATENDENTE"));
            incidente.IDSOLICITANTE = Convert.ToInt32(GetTextValue(doc, "IDSOLICITANTE"));
            incidente.IDSUBCATEGORIA = Convert.ToInt32(GetTextValue(doc, "IDATENDENTE"));
            incidente.DESCRINCIDENTE = GetTextValue(doc, "DESCRINCIDENTE");
            incidente.DATAABERTURA = Convert.ToDateTime(GetTextValue(doc, "DATAABERTURA"));
            incidente.DATAFECHAMENTO = Convert.ToDateTime(GetTextValue(doc, "DATAFECHAMENTO"));
            incidente.IDSTATUS = Convert.ToInt32(GetTextValue(doc, "IDSTATUS"));
            incidente.IDPRIORIDADE = Convert.ToInt32(GetTextValue(doc, "IDPRIORIDADE"));

            db.SaveChanges();

            return View(incidente);



        }

        private string GetTextValue(XmlDocument doc, string tagName)
        {
            XmlNodeList nodelist = doc.GetElementsByTagName(tagName);
            if (nodelist.Count > 0)
            {
                XmlNode node = nodelist[0];
                return node.InnerText;
            }
            return string.Empty;

        }

        private void CriarCampoPropriedade(XmlDocument xmldoc, XmlElement
             elementRoot, string nodeName, string nodeValue)
        {
            XmlElement nodeIdIncidente = xmldoc.CreateElement(nodeName);
            XmlText txtIdIncidente = xmldoc.CreateTextNode(nodeValue);
            nodeIdIncidente.AppendChild(txtIdIncidente);
            elementRoot.AppendChild(nodeIdIncidente);


        }


        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}
